package com.bicon.botu.account.controller;


import com.bicon.botu.account.common.AccountConstants;
import com.bicon.botu.account.common.utils.Encrypt;
import com.bicon.botu.account.dto.AccountInfoDTO;
import com.bicon.botu.account.service.IAccountService;
import com.bicon.botu.core.base.common.Constants;
import com.bicon.botu.core.base.common.controller.BaseController;
import com.bicon.botu.core.base.common.entity.BaseResult;
import com.bicon.botu.core.base.common.utils.EncryptionUtil;
import com.bicon.botu.core.base.common.utils.IdGenerator;
import com.bicon.botu.core.base.common.utils.StringUtils;
import com.bicon.botu.core.base.repository.redis.RedisHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;


/**
 * web管理端账户管理
 *
 * @author liushujie
 * @date 2018-7-13 10:39:37
 */
@Slf4j
@RestController
@RequestMapping("/account")
public class AccountController extends BaseController {

    @Autowired
    private IAccountService iAccountService;

    @Autowired
    private RedisHandler redisHandler;

    /**
     * 登录操作
     *
     * @param account  登录账号
     * @param password 登录密码
     * @param type     登录类型:1移动端，2后台管理端，3平台端
     * @return
     */
    @RequestMapping(value = "/static/login", method = RequestMethod.POST)
    public BaseResult login(@RequestParam String account, @RequestParam String password, @RequestParam Integer type) {
        //检查账号是否存在
        AccountInfoDTO  accountInfoDTO = iAccountService.detail(account,type);
        if(null == accountInfoDTO){
            return new BaseResult(Constants.RESPONSE_CODE_602, "该账号不存在！");
        }
        if (accountInfoDTO.getEnable().equals(AccountConstants.ENABLE_FALSE)) {
            //判断账号的状态
            return new BaseResult(Constants.RESPONSE_CODE_405, "该账号已被禁用！");
        } else if (!accountInfoDTO.getPassword().equals(Encrypt.md5ForAuth(password, accountInfoDTO.getSalt()))) {
            //密码错误
            return new BaseResult(Constants.RESPONSE_CODE_403, "密码错误");
        }
        //校验通过，token放入缓存，成功返回token
        String token = IdGenerator.create24Id();
        boolean flag = redisHandler.getGlobalRedisTemplate().cacheStringValue(AccountConstants.BOTU_USER_WEB_TOKEN, token, accountInfoDTO.getId(), AccountConstants.TOKEN_EXPIRE_TIME);
        if(flag){
            return sendResult200(new AccountInfoDTO(accountInfoDTO.getAccount(), token,accountInfoDTO.getId()));
        }
        return  sendResult500();
    }

    /**
     * web端发送验证码---忘记密码使用
     * @param account 账号
     * @param type 类型 登录类型（1：客户端，2：商家，3：平台）
     * @param flag 1:登录，2：注册，3：忘记密码，管理端不能注册，暂时不需要传此参数
     * @return
     */
    @RequestMapping(value = "/static/sendSms", method = RequestMethod.POST)
    public BaseResult sendSms(@RequestParam String account, @RequestParam Integer type, @RequestParam String flag) {
        if (StringUtils.isEmpty(account)) {
            return new BaseResult(Constants.RESPONSE_CODE_400, Constants.RESPONSE_MESSAGE_400);
        }
        //检查账号是否存在
        if(!iAccountService.checkAccountExist(account,type)){
            return new BaseResult(Constants.RESPONSE_CODE_602, "该账号不存在！");
        }
        if(iAccountService.sendSmsCode(account,type)){
            return sendResult200();
        }
        return sendResult500();
    }


    /**
     * 忘记密码
     * @param account 账号
     * @param password 密码
     * @param type 类型 登录类型（1：客户端，2：商家，3：平台）
     * @param code 校验码
     * @return
     */
    @RequestMapping(value = "/static/forgetpwd", method = RequestMethod.POST)
    public BaseResult forgetPassword(@RequestParam String account, @RequestParam String password, @RequestParam Integer type, @RequestParam String code) {
        if (StringUtils.isEmpty(password) || password.length() < 6) {
            return new BaseResult(Constants.RESPONSE_CODE_401, "密码长度小于6");
        }
        //检查账号是否存在
        AccountInfoDTO  accountInfoDTO = iAccountService.detail(account,type);
        if(null == accountInfoDTO){
            return new BaseResult(Constants.RESPONSE_CODE_602, "该账号不存在！");
        }
        if (accountInfoDTO.getEnable().equals(AccountConstants.ENABLE_FALSE)) {
            //判断账号的状态
            return new BaseResult(Constants.RESPONSE_CODE_405, "该账号已被禁用！");
        }
        //检查验证码是否正确
        if(!iAccountService.verifySmsCode(account,code,type)){
            return new BaseResult(Constants.RESPONSE_CODE_405, "验证码错误或失效！");
        }
        //修改密码操作
        if(iAccountService.forgetPassByAccout(account,Encrypt.md5ForAuth(password, accountInfoDTO.getSalt()),type)){
            return sendResult200();
        }
        return sendResult500();
    }

    /**********用户权限相关接口**************/
    /**
     * 分页查询账户列表
     *
     * @param pageNo   页码
     * @param pageSize 每页显示数量
     * @param type     登录类型（1：客户端，2：商家，3：平台）
     * @return
     */
    @RequestMapping(value = "/selectAccounts", method = RequestMethod.POST)
    public BaseResult selectAccounts(@RequestParam Integer pageNo, @RequestParam Integer pageSize, @RequestParam Integer type) {
        return sendResult200(iAccountService.selectAccounts(pageNo, pageSize, type));
    }


    /**
     * 更新账户状态
     *
     * @param id     账号id
     * @param enable 是否启用0:启用、1：禁用
     * @return
     */
    @RequestMapping(value = "/updateAccountState")
    public BaseResult updateAccountState(@RequestParam String id, @RequestParam Integer enable) {
        if(iAccountService.updateAccountState(id, enable)){
            return sendResult200();
        }
        return sendResult500();
    }

    /**
     * 新增后台账户
     *
     * @param account  登录账号 手机号
     * @param password 登录密码
     * @param enable   类型：0：正常、1：禁用状态
     * @param type     登录类型（1：客户端，2：商家，3：平台）
     * @return
     */
    @RequestMapping(value = "/saveAccount", method = RequestMethod.POST)
    public BaseResult saveAccount(@RequestParam String account, @RequestParam String password,
                                  @RequestParam Integer enable, @RequestParam Integer type) {

        //检查账号是否存在
        AccountInfoDTO accountInfoDTO = iAccountService.detail(account, type);
        if (null != accountInfoDTO) {
            return new BaseResult(Constants.RESPONSE_CODE_602, "该手机号已注册，请直接登录！");
        }
        //新增
        if(iAccountService.saveAccount(account, password, enable, type)){
            return sendResult200();
        }
        return sendResult500();
    }

    /**
     * 更新账户信息
     * 更新密码
     * @param id       账号id
     * @param account  账号
     * @param password 密码
     * @param type     登录类型（1：客户端，2：商家，3：平台）
     * @return
     */
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public BaseResult update(@RequestParam String id, @RequestParam String account,
                             @RequestParam(required = false) String password, @RequestParam Integer type) {
        if(iAccountService.update(id, account, password, type)){
            return sendResult200();
        }
        return sendResult500();
    }


    /**
     * 初始化app用户缓存
     *
     * @return
     */
    @RequestMapping(value = "/initAccount", method = RequestMethod.GET)
    public BaseResult initAccount() {
        if(iAccountService.initAccount()){
            return sendResult200();
        }
        return sendResult500();
    }

    /**
     * 后台添加app用户及角色
     *
     * @param account  账户
     * @param code     角色code
     * @param password 密码
     * @return
     */
    @RequestMapping(value = "/addAccountAndRole")
    public BaseResult addAccountAndRole(@RequestParam String account, @RequestParam String code,  @RequestParam Integer type,  @RequestParam String password) {
        if (StringUtils.isEmpty(account) || StringUtils.isEmpty(code) ) {
            return new BaseResult(Constants.RESPONSE_CODE_400, Constants.RESPONSE_MESSAGE_400);
        }
        return iAccountService.addAccountAndRole(account, code, type,password);
    }




    /**
     * 密码加密
     * @param pwd
     * @return
     */
    private String md5(String pwd){
        try {
            pwd = EncryptionUtil.getMD5(pwd);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return pwd;
    }


}
